x86: vcpu_destroy_pagetables() must not return -EINTR
authorKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Mon, 26 Jan 2015 11:51:09 +0000 (12:51 +0100)
committerJan Beulich <jbeulich@suse.com>
Mon, 26 Jan 2015 11:51:09 +0000 (12:51 +0100)
commitde4f284b3d7b47d3b9807f354552ecf3e0fff56b
tree490867207bed9ad11a77f247df1b79ad7dfa2e9c
parentb18b6daf65554fd9e1b6008513bfd50a7ef5d3e9
x86: vcpu_destroy_pagetables() must not return -EINTR

.. otherwise it has the side effect that: domain_relinquish_resources
will stop and will return to user-space with -EINTR which it is not
equipped to deal with that error code; or vcpu_reset - which will
ignore it and convert the error to -ENOMEM..

The preemption mechanism we have for domain destruction is to return
-EAGAIN (and then user-space calls the hypercall again) and as such we need
to catch the case of:

domain_relinquish_resources
  ->vcpu_destroy_pagetables
    -> put_page_and_type_preemptible
       -> __put_page_type
           returns -EINTR

and convert it to the proper type. For:

XEN_DOMCTL_setvcpucontext
 -> vcpu_reset
   -> vcpu_destroy_pagetables

we need to return -ERESTART otherwise we end up returning -ENOMEM.

There are also other callers of vcpu_destroy_pagetables: arch_vcpu_reset
(vcpu_reset) are:
 - hvm_s3_suspend (asserts on any return code),
 - vlapic_init_sipi_one (asserts on any return code),

Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
xen/arch/x86/mm.c